package com.opcode.costa.ui.menu;

import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;

import com.opcode.costa.R;
import com.opcode.costa.ui.menu.addorder.AddOrderActivity;
import com.opcode.costa.ui.menu.neworder.NewOrderActivity;
import com.opcode.nebulamobil.base.activities.FragmentActivityBase;
import com.opcode.nebulamobil.base.components.ButtonBase;
import com.opcode.nebulamobil.base.components.LinearLayoutBase;
import com.opcode.nebulamobil.base.components.ListViewBase;
import com.opcode.nebulamobil.base.components.TextViewBase;
import com.opcode.nebulamobil.base.fragments.ResponsiveFragmentBase;
import com.opcode.nebulamobil.base.fragments.dialogfragments.RoundedProgressDialogBase;
import com.opcode.nebulamobil.base.interfaces.OnButtonBaseClickListener;
import com.opcode.nebulamobil.base.interfaces.OnListViewBaseItemClickListener;
import com.opcode.nebulamobil.information.ApplicationInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ActiveTableDataForm;
import com.opcode.nebulamobil.information.requests.costarequests.ActiveTableReq;
import com.opcode.nebulamobil.information.requests.costarequests.TableListReq;
import com.opcode.nebulamobil.information.responses.JSONResponse;
import com.opcode.nebulamobil.information.responses.costaresponses.ActivationResp;
import com.opcode.nebulamobil.information.responses.costaresponses.ActiveTableResp;
import com.opcode.nebulamobil.information.responses.costaresponses.TableListResp;
import com.opcode.nebulamobil.utility.JsonConverter;
import com.opcode.nebulamobil.utility.UniqueIdCreator;

/**
 * Bu sınıf, sipariş butonuna basıldıktan sonra açılan ekranda siparişe ait
 * işlemleri yapabilmek için hazırlanmıştır. Bu ekran üzerinden yeni sipariş
 * verebilir, var olan bir siparişe ekleme yapabilir ve hesabı alabiliriz.
 * 
 * @author Okan ERDOĞAN 12 Haz 2014
 */
public class MenuOptionsFragment extends ResponsiveFragmentBase{

	private View vi;

	/*
	 * Yeni sipariş verebilmek için gerekli nesne referansları aşağıdadır. Bu
	 * nesne referanslarından newOrderButton nesnesi yeni sipariş verebilmek
	 * için gerekli aktiviteyi faaliyete geçirir. newOrderIntent nesnesi de yeni
	 * sipariş aktivitesinin çalıştırılması için kullanılacaktır. addOrderIntent
	 * nesnesi de sipariş eklemek için gerekli aktiviteyi açmamızı sağlayan
	 * nesnedir.
	 */
	private ButtonBase newOrderButton;
	private Intent newOrderIntent, addOrderIntent;

	/*
	 * Bu ekranın en üstünde yeni sipariş aktivitesini açabilmek için gereken
	 * yeni sipariş butonu yer almaktadır. Yeni sipariş butonunu altında ise
	 * hali hazırda sipariş vermiş olan masalara ait bilgiler listelenir. Bu
	 * listelenme işi iki farklı listView ile gösterilmektedir. Dolayısıyla bu
	 * iki farklı listView objesinin kendilerine ait arraylist'i, ve yine
	 * kendilerine özel arrayadapter'ları mevcuttur. Aşağıda yer alan nesne
	 * referansları bu iş için gerekli arrayadapter'lar,arraylist'ler ve
	 * listview objelerine aittir.
	 */
	private ActiveTablesListAdapter activeTablesListAdapter;
	private ActiveTablesListAdapter2 activeTablesListAdapter2;

	private Handler myHandler = null;
	private Runnable myRunnable = null;

	private ArrayList<ActiveTableDataForm> activeTableInfoDataFormList,activeTableInfoDataFormLeftList, activeTableInfoDataFormRightList;
	private ListViewBase activeTablesListview1, activeTablesListview2;
	
	private RoundedProgressDialogBase roundedProgressDialogBase;

	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		this.vi = inflater.inflate(R.layout.menu_options_fragment_layout,container, false);

		/*
		 * Sunucudan gelen aktif masa bilgileri iki farklı listview'da
		 * gösterileceği için her bir listview'a özel arraylist'lerin olması
		 * gerekmektedir. Aşağıdaki nesneler bu arraylist nesneleridir.
		 */
		this.activeTableInfoDataFormLeftList = new ArrayList<ActiveTableDataForm>();
		this.activeTableInfoDataFormRightList = new ArrayList<ActiveTableDataForm>();

		myHandler = new Handler();

		myRunnable = new Runnable() {
			public void run() {
				activeTablesListAdapter = new ActiveTablesListAdapter(getActivity(), R.layout.active_tables_list_item,activeTableInfoDataFormLeftList);
				/*
				 * Hazırlanan adapter nesneleri listview'lara veriliyor.
				 */
				activeTablesListview1.setAdapter(activeTablesListAdapter);

				activeTablesListAdapter.notifyDataSetChanged();

				/*
				 * Sağ ve soldaki listedeki listview'ları hazırlamak için
				 * gerekli adapter nesneleri oluşturuluyor.
				 */
				activeTablesListAdapter2 = new ActiveTablesListAdapter2(getActivity(), R.layout.active_tables_list_item,activeTableInfoDataFormRightList);
				activeTablesListview2.setAdapter(activeTablesListAdapter2);
				activeTablesListAdapter2.notifyDataSetChanged();
			}
		};

		/*
		 * Listview objeleri layout'ta elde ediliyor ve nesne referansına
		 * bağlanıyor.
		 */
		this.activeTablesListview1 = (ListViewBase) this.vi.findViewById(R.id.active_tables_listview1);
		this.activeTablesListview2 = (ListViewBase) this.vi.findViewById(R.id.active_tables_listview2);

		/*
		 * Yapılacak işleme göre gerekli aktiviteyi açacak olan intent nesneleri
		 * burada oluşturulmaktadır.
		 */
		this.addOrderIntent = new Intent(this.getActivity(),AddOrderActivity.class);

		/*
		 * Yeni sipariş butonuna basıldığında yapılması gereken işler bu bölümde
		 * yer almaktadır.
		 */
		this.newOrderButton = (ButtonBase) this.vi.findViewById(R.id.new_order_button);
		this.newOrderButton.setOnButtonBaseClickListener(new OnButtonBaseClickListener() {
			
			@Override
			public void onButtonBaseClick(View v) {
				createRequest();
			}
		});

		/*
		 * Aktif masalar listesinin ilkinden bir seçim yapıldığından aşağıdaki
		 * metod tetiklenir. Bu metod aktif masa bilgisini Sipariş ekleme
		 * aktivitesine gönderir.
		 */
		activeTablesListview1.setOnListViewBaseItemClickListener(new OnListViewBaseItemClickListener() {
			
			@Override
			public void onListViewItemClick(AdapterView<?> parent, View view,int position, long id) {
				addOrderIntent.putExtra("ACTIVE_TABLE",activeTableInfoDataFormLeftList.get(position));
				getActivity().startActivity(addOrderIntent);
			}
		});

		/*
		 * Aktif masalar listesinin ikincisinden bir seçim yapıldığından
		 * aşağıdaki metod tetiklenir. Bu metod aktif masa bilgisini Sipariş
		 * ekleme aktivitesine gönderir.
		 */
		
		activeTablesListview2.setOnListViewBaseItemClickListener(new OnListViewBaseItemClickListener() {
			
			@Override
			public void onListViewItemClick(AdapterView<?> parent, View view,int position, long id) {
				addOrderIntent.putExtra("ACTIVE_TABLE",activeTableInfoDataFormRightList.get(position));
				getActivity().startActivity(addOrderIntent);
			}
		});

		activeTablesListAdapter = new ActiveTablesListAdapter(getActivity(),R.layout.active_tables_list_item,activeTableInfoDataFormLeftList);
		/*
		 * Hazırlanan adapter nesneleri listview'lara veriliyor.
		 */
		activeTablesListview1.setAdapter(activeTablesListAdapter);

		/*
		 * Sağ ve soldaki listedeki listview'ları hazırlamak için gerekli
		 * adapter nesneleri oluşturuluyor.
		 */
		activeTablesListAdapter2 = new ActiveTablesListAdapter2(getActivity(),R.layout.active_tables_list_item,activeTableInfoDataFormRightList);
		activeTablesListview2.setAdapter(activeTablesListAdapter2);

		this.roundedProgressDialogBase=new RoundedProgressDialogBase();

		return this.vi;
	}

	public void onResume() {
		super.onResume();
		createActiveTableRequest();
	}

	private void updateGUI() {
		myHandler.post(myRunnable);
	}

	/**
	 * Bu metod parametre olarak sunucudan gelen activeTableResp nesnesini alır.
	 * Bu nesne içerisinde daha önceden sipariş verilmiş olan masalara ait
	 * bilgileri barındırır.
	 * 
	 * @param activeTablesResp
	 */
	public void prepareActiveTableList(ActiveTableResp activeTablesResp) {
		/*
		 * Aktif olan (Daha önceden sipariş vermiş) masalar sunucudan elde
		 * ediliyor. Şu anda sunucu tarafı hazır olmadığı için bu bilgiler
		 * DemoDatas sınıfından elde edilmektedir.
		 */
		this.activeTableInfoDataFormList = activeTablesResp.getActiveTableList();

		/*
		 * Burada sol ve sağdaki masalarda yer alacak olan bilgiler öncelikle
		 * temizleniyor. Daha sonra ise aktif masa listesindeki veriler sağdaki
		 * ve soldaki ekranda gösterilmek üzere iki ayrı listeye
		 * paylaştırılıyor.
		 */
		activeTableInfoDataFormLeftList.clear();
		activeTableInfoDataFormRightList.clear();

		for (int i = 0; i < activeTableInfoDataFormList.size(); i++) {
			if ((i % 2) == 0) {
				activeTableInfoDataFormLeftList.add(activeTableInfoDataFormList.get(i));
			} else {
				activeTableInfoDataFormRightList.add(activeTableInfoDataFormList.get(i));
			}
		}

		updateGUI();
	}

	/**
	 * Yeni sipariş butonuna basıldığı zaman bu metod çağrılarak sunucudan
	 * sipariş verilebilecek masalar istenir.
	 */
	public void createRequest() {
		
		((FragmentActivityBase) getActivity()).showGeneralDialog(this.roundedProgressDialogBase, "MENU_OPTIONS_PROGRESS_DIALOG");

		TableListReq tableListReq = new TableListReq();
		tableListReq.setType("TableListReq");
		tableListReq.setRequestId(UniqueIdCreator.createUniqueID());
		ApplicationInfo.getRequestListener().jsonRequestCame(
		JsonConverter.toJsonString(tableListReq));
	}

	/**
	 * Bu fragment açılır açılmaz sunucudan aktif masaların listesi istenir.
	 * Aktif masadan kasıt daha önceden sipariş verilmiş masalardır.
	 */
	public void createActiveTableRequest() {
		((FragmentActivityBase) getActivity()).showGeneralDialog(this.roundedProgressDialogBase, "MENU_OPTIONS_PROGRESS_DIALOG");

		ActiveTableReq activeTableReq = new ActiveTableReq();
		activeTableReq.setType("ActiveTableReq");
		activeTableReq.setRequestId(UniqueIdCreator.createUniqueID());
		ApplicationInfo.getRequestListener().jsonRequestCame(JsonConverter.toJsonString(activeTableReq));

	}

	/**
	 * Bu sınıf aktif masa listesini hazırlarken kullanılmaktadır.
	 * 
	 * @author Okan ERDOĞAN 12 Haz 2014
	 */
	class ActiveTablesListAdapter extends ArrayAdapter<ActiveTableDataForm> {

		private Context context;
		private int resourceId;
		private ArrayList<ActiveTableDataForm> arrayList;

		private int counter;

		public ActiveTablesListAdapter(Context context, int textViewResourceId,ArrayList<ActiveTableDataForm> objects) {
			super(context, textViewResourceId, objects);

			this.context = context;
			this.resourceId = textViewResourceId;
			this.arrayList = objects;

		}

		public View getView(int position, View convertView, ViewGroup parent) {

			convertView = LayoutInflater.from(this.context).inflate(this.resourceId, null);

			ActiveTableDataForm activeTableDataForm = (ActiveTableDataForm) arrayList.get(position);

			TextViewBase activeTableItemTextview = (TextViewBase) convertView.findViewById(R.id.active_table_item_textview);
			TextViewBase activeTableStatusTextview = (TextViewBase) convertView.findViewById(R.id.active_table_status_textview);
			LinearLayoutBase activeTableItemLinearlayout = (LinearLayoutBase) convertView.findViewById(R.id.active_table_item_linearlayout);

			activeTableItemTextview.setText("Masa "+ activeTableDataForm.getTableDataForm().getTableNumber());

			switch (activeTableDataForm.getStatus()) {
			case 1:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz mutfakta hazırlanıyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());	
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_background6);
				break;
			case 2:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz hazır.Garson bekleniyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd7);
				break;
			case 3:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Sipariş müşteriye iletildi.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd8);
				break;
				
			case 4:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz hazır. Mutfakta bekliyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd9);
				break;
			case 5:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Sipariş herhangi bir yerde değil.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd10);
				break;
			}

			return convertView;
		}

		public int getCount() {
			return arrayList.size();
		}

		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
			arrayList = activeTableInfoDataFormLeftList;
		}
	}

	/**
	 * Bu sınıf aktif masa listesini hazırlarken kullanılmaktadır.
	 * 
	 * @author Okan ERDOĞAN
	 * 
	 *	7 Ağu 2014
	 */
	class ActiveTablesListAdapter2 extends ArrayAdapter<ActiveTableDataForm> {

		private Context context2;
		private int resourceId2;
		private ArrayList<ActiveTableDataForm> arrayList2;

		private int counter2;

		public ActiveTablesListAdapter2(Context context,int textViewResourceId, ArrayList<ActiveTableDataForm> objects) {
			super(context, textViewResourceId, objects);

			this.context2 = context;
			this.resourceId2 = textViewResourceId;
			this.arrayList2 = objects;

		}

		public View getView(int position, View convertView, ViewGroup parent) {

			convertView = LayoutInflater.from(this.context2).inflate(this.resourceId2, null);

			ActiveTableDataForm activeTableDataForm = (ActiveTableDataForm) arrayList2.get(position);

			TextViewBase activeTableItemTextview = (TextViewBase) convertView.findViewById(R.id.active_table_item_textview);
			TextViewBase activeTableStatusTextview = (TextViewBase) convertView.findViewById(R.id.active_table_status_textview);
			LinearLayoutBase activeTableItemLinearlayout = (LinearLayoutBase) convertView.findViewById(R.id.active_table_item_linearlayout);

			activeTableItemTextview.setText("Masa "+ activeTableDataForm.getTableDataForm().getTableNumber());

			switch (activeTableDataForm.getStatus()) {
			case 1:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz mutfakta hazırlanıyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());	
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_background6);
				break;
			case 2:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz hazır.Garson bekleniyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd7);
				break;
			case 3:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Sipariş müşteriye iletildi.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd8);
				break;
				
			case 4:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Siparişiniz hazır. Mutfakta bekliyor.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd9);
				break;
			case 5:
				if(activeTableDataForm.getStatusMessage()==null){
					activeTableStatusTextview.setText("Sipariş herhangi bir yerde değil.");
				}else{
					activeTableStatusTextview.setText(activeTableDataForm.getStatusMessage());		
				}
				activeTableItemLinearlayout.setBackgroundResource(R.drawable.item_bckgrnd10);
				break;
			}

			return convertView;
		}

		public int getCount() {
			return arrayList2.size();
		}

		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
			arrayList2 = activeTableInfoDataFormRightList;
		}
	}

	/**
	 * Sunucudan gelen cevaplar bu metoda düşüyor.
	 */
	@Override
	public void responseCame(String response) {

		JSONResponse responseObject = (JSONResponse) JsonConverter.fromJsonString(response, JSONResponse.class);

		if (responseObject.getType().equals("ActivationResp")) {
			ActivationResp activasionResp = (ActivationResp) JsonConverter.fromJsonString(response, ActivationResp.class);
			if (activasionResp.isActResult()) {
				Log.i("ActivationDialog", "Aktivasyon onaylandı.");
				createActiveTableRequest();
			} else {
				Log.i("ActivationDialog", "Aktivasyon onaylanmadı. - "+ activasionResp.getActMessage());
			}
		}
		if (responseObject.getType().equals("TableListResp")) {
			TableListResp tableListResp = (TableListResp) JsonConverter.fromJsonString(response, TableListResp.class);
			this.newOrderIntent = new Intent(this.getActivity(),NewOrderActivity.class);
			this.newOrderIntent.putExtra("TableListResp", tableListResp);
			startActivity(this.newOrderIntent);
		} else if (responseObject.getType().equals("ActiveTableResp")) {
			ActiveTableResp activeTablesResp = (ActiveTableResp) JsonConverter.fromJsonString(response, ActiveTableResp.class);
			prepareActiveTableList(activeTablesResp);
		}

		if ((FragmentActivityBase) getActivity() != null) {
			((FragmentActivityBase) getActivity()).closeGeneralDialog(roundedProgressDialogBase, "MENU_OPTIONS_PROGRESS_DIALOG");
		}
	}
}
